package hospital.util;

import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Collections;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import org.hibernate.ejb.criteria.expression.function.LengthFunction;

public class HospitalUtil {
	// public static List<Integer> yearList = new ArrayList<Integer>();
	// public static List<Integer> monthList = new ArrayList<Integer>();
	// public static List<Integer> dayList_31 = new ArrayList<Integer>();
	// public static List<Integer> dayList_30 = new ArrayList<Integer>();
	// public static List<Integer> dayList_29 = new ArrayList<Integer>();
	// public static List<Integer> dayList_28 = new ArrayList<Integer>();
	// public static List<Integer> hourList = new ArrayList<Integer>();
	// public static List<Integer> minuteList = new ArrayList<Integer>();
	// public static List<String> genderList = new ArrayList<String>();
	//
	// static {
	// genderList.add("male");
	// genderList.add("female");
	// for (int i = Calendar.getInstance().get(Calendar.YEAR); i >= 1900; i--) {
	// yearList.add(i);
	// }
	// for (int i = 1; i <= 12; i++) {
	// monthList.add(i);
	// }
	// for (int i = 1; i <= 31; i++) {
	// dayList_31.add(i);
	// }
	// for (int i = 1; i <= 30; i++) {
	// dayList_30.add(i);
	// }
	// for (int i = 1; i <= 29; i++) {
	// dayList_29.add(i);
	// }
	// for (int i = 1; i <= 28; i++) {
	// dayList_28.add(i);
	// }
	// for (int i = 0; i <= 23; i++) {
	// hourList.add(i);
	// }
	// for (int i = 0; i <= 59; i++) {
	// minuteList.add(i);
	// }
	// }
	//
	// public static boolean isLeapYear(int year) {
	// if ((year % 400 == 0) || ((year % 4 == 0) && (year % 100 != 0))) {
	// return true;
	// } else {
	// return false;
	// }
	// }

	public String encrypt(String s) {
		return doEncrypt(s);
	}

	private String doEncrypt(String s) {
		String salt = "thisissalt!@#$%^)(*&";
		MessageDigest messageDigest = null;
		try {
			messageDigest = MessageDigest.getInstance("MD5");
			messageDigest.update((s + salt).getBytes());
		} catch (NoSuchAlgorithmException e) {
			e.printStackTrace();
		}
		return (new BigInteger(messageDigest.digest())).toString(16);
	}

	public long idWrapper(long id, byte role) {
		return doIdWrapper(id, role);
	}

	private long doIdWrapper(long id, byte role) {
		String strId = String.valueOf(id);
		if (role != 0) {
			strId = String.format("%d%0" + (6 - strId.length()) + "d%s", role + 4, 0, strId);
		} else {
			strId = String.format("%d%0" + (7 - strId.length()) + "d%s", 1, 0, strId);
		}
		return Long.valueOf(strId);
	}

	public long deIdWrapper(String strId, byte role) {
		return doDeIdWrapper(strId, role);
	}

	private long doDeIdWrapper(String strId, byte role) {
		Pattern pattern = Pattern.compile("\\d*");
		Matcher matcher = pattern.matcher(strId);
		if (!matcher.matches()) {
			return -2;
		}
		int startIndex = 1;
		if (role != 0) {
			if (strId.length() != 7 || Byte.valueOf(strId.substring(0, 1)) != (role + 4)) {
				return -2;
			}
		} else {
			if (strId.length() != 8 || Byte.valueOf(strId.substring(0, 1)) != 1) {
				return -2;
			}
		}

		for (int i = 1; i < strId.length(); i++) {
			if (strId.charAt(i) != '0') {
				startIndex = i;
				break;
			}
		}
		return Long.valueOf(strId.substring(startIndex));
	}
}
